from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import sqlalchemy
app = Flask(__name__)



# MySQL所在的主机名
HOSTNAME = "127.0.0.1"
# MySQL监听的端口号，默认3306
PORT = 3306
# 连接MySQL的用户名，读者用自己设置的
USERNAME = "root"
# 连接MySQL的密码，读者用自己的
PASSWORD = "caofengyang123.."
# MySQL上创建的数据库名称
DATABASE = "database_learn"
app.config['SQLALCHEMY_DATABASE_URI'] = f"mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8mb4"


# 在app.config中设置好连接数据库的信息
# 然后使用SQLALchemy(app)创建一个db对象
# SQLAlchemy会自动读取app.config中连接数据库的信息
db = SQLAlchemy(app)
with app.app_context():
    print(db.engine)


# with app.app_context():
#     with db.engine.connect() as conn:
#         rs = conn.execute(sqlalchemy.text("select 1"))
#         print(rs.fetchone())  # (1,)，表示已经连接成功


#继承db连接的，把user类映射到数据库当中，并将表名设为user
class User(db.Model):
    __tablename__="user"
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    username = db.Column(db.String(100), nullable=False)
    password = db.Column(db.String(100), nullable=False)

user = User(username="法外狂徒张三", password='111111')
# user = User(username="法外狂徒张三", password='111111')
# sql: insert user(username, password) values('法外狂徒张三', '111111');

#有时候出错是应用上下文的问题，因此加上这个就不会有上下文的问题
with app.app_context():
    db.create_all() # 同步数据库表到Navicat

@app.route('/')
def hello_world():  # put application's code here
    return 'Hello World!'

@app.route("/user/add")
def add_user():
    # 1、创建ORM对象
    user = User(username="法外狂徒张三", password='111111')
    # 2、将ORM对象添加到db.session中
    db.session.add(user)
    # 3、将db.session中的改变同步到数据库中
    db.session.commit()
    return "用户创建成功"

@app.route("/user/query")
def query_user():
    #1. get查找：根据主键查找
    # user = User.query.get(1)
    # print(f"{user.id}: {user.username}--{user.password}")
    #2. filter_by查找：查找多条
    # Query：类数组
    users = User.query.filter_by(username="法外狂徒张三") # 返回的是数组
    print(type(users))
    for user in users:
        print(user.username)
    return "数据查找成功！"

@app.route("/user/update")
def update_user():
    user = User.query.filter_by(username="法外狂徒张三").first()#返回的是元素
    user.password = "222222"
    # 3、将db.session中的改变同步到数据库中
    db.session.commit()
    return "数据修改成功"
if __name__ == '__main__':
    app.run()
